package com.naiterui.ehp.bs.recommend.remote;

import com.naiterui.ehp.bp.bo.im.RecomSendDTO;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.naiterui.common.repository.page.PageParamVO;
import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.bo.cms.DrRecordAuthorityBO;
import com.naiterui.ehp.bp.bo.doctor.RecomUserInfoBO;
import com.naiterui.ehp.bp.bo.emr.DrRecordIdBO;
import com.naiterui.ehp.bp.bo.emr.MedicalRecordBO;
import com.naiterui.ehp.bp.bo.emr.MedicalRecordDoctorBO;
import com.naiterui.ehp.bp.bo.emr.params.DrCaseParams;
import com.naiterui.ehp.bp.bo.medication.MedicationDefaultUsageBO;
import com.naiterui.ehp.bp.bo.medication.MedicationDetailBO;
import com.naiterui.ehp.bp.bo.medication.param.MedicationParamBO;
import com.naiterui.ehp.bp.bo.recommend.param.RecomBuyNotifyParamBO;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.recommend.vo.InventoryInfoVo;
import com.naiterui.ehp.bs.recommend.vo.MedicationBoxVO;
import com.naiterui.ehp.bs.recommend.vo.PatientNameVO;
import com.naiterui.ehp.bs.recommend.vo.dto.DoctorRecordDTO;
import com.naiterui.ehp.bs.recommend.vo.dto.IMRecomRemindDTO;
import com.naiterui.ehp.bs.recommend.vo.dto.IMSendResultDTO;
import com.naiterui.ehp.bs.recommend.vo.dto.RecordHospitalDTO;
import com.naiterui.ehp.bs.recommend.vo.param.DiagnosisVO;

public interface IRecommendRemoter {

    /**
     * 医生token校验
     * IRemoter.checkDrToken()
     *
     * @param doctorId
     * @param token
     *
     * @return
     *
     * @throws Exception
     * @Author guoyongxiang
     * @Date 2017年7月27日
     * @since 2.9.0
     */
    boolean checkDrToken(String doctorId, String token) throws BusinessException;

    /**
     * 反写患者备注名
     *
     * @param doctorId    医生id
     * @param patientId   患者id
     * @param patientName 患者姓名
     *
     * @throws Exception
     * @Description
     * @author wangchuan
     * @Date 2017年7月31日
     * @since V2.9.0
     */
    Boolean saveRemarkName(Long doctorId, Long patientId, String patientName, Integer gender, Integer age, String ageUnit) throws BusinessException;

    /**
     * 推荐用药获取用户信息
     *
     * @param doctorId      医生ID
     * @param patientId     患者ID
     * @param fetchNickname 是否获取昵称，true获取 ， false不获取。默认true
     *
     * @return
     *
     * @throws BusinessException
     * @Description 医生+患者
     * @author wangchuan
     * @Date 2017年8月3日
     * @since V2.9.0
     */
    RecomUserInfoBO getUserInfo(Long doctorId, Long patientId, boolean... fetchNickname) throws BusinessException;

    /**
     * 发送IM推药消息
     * IRemoter.sendRecomMessage()
     *
     * @param recomSendDTO
     *
     * @return
     *
     * @Author guoyongxiang
     * @Date 2017年8月4日
     * @since 2.9.0
     */
    IMSendResultDTO sendRecomMessage(RecomSendDTO recomSendDTO) throws BusinessException;

    /**
     * 更新医生会话推药标识
     * IRemoter.updateConsultSessionRecomFlag()
     *
     * @param consultSessionId
     *
     * @Author guoyongxiang
     * @Date 2017年8月4日
     * @since 2.9.0
     */
    void updateConsultSessionRecomFlag(Long consultSessionId) throws BusinessException;

    /**
     * 重置医生端患者复购提醒
     * IRemoter.rePurchaseRemindReset()
     *
     * @param patientId
     *
     * @throws BusinessException
     * @Author guoyongxiang
     * @Date 2017年8月5日
     * @since 2.9.0
     */
    void rePurchaseRemindReset(Long patientId) throws BusinessException;

    /**
     * 根据医生ID查询医生备案、认证相关信息
     * IRemoter.getDoctorRecordByDoctorId()
     *
     * @param doctorId
     *
     * @return
     *
     * @throws BusinessException
     * @Author Ldl
     * @Date 2017年8月7日
     * @since 1.0.0
     */
    DoctorRecordDTO getDoctorRecordByDoctorId(Long doctorId) throws BusinessException;

    /**
     * 诊断库搜索
     * IRemoter.searchDiagnosis()
     *
     * @param doctorId
     * @param keyword
     * @param paramVO
     *
     * @return
     *
     * @throws BusinessException
     * @throws IOException
     * @Author chenlin
     * @Date 2017年8月7日
     * @since 1.0.0
     */
    PageVO<DiagnosisVO> searchDiagnosis(Long doctorId, String keyword, String skuIds, PageParamVO paramVO) throws BusinessException;

    /**
     * 推荐用药添加诊疗记录
     * IRemoter.addPrescriptionRecord()
     *
     * @param doctorId
     * @param patientId
     * @param recomId
     *
     * @Author mudou
     * @Date 2017年8月8日
     * @since 2.9.0
     */
    void addPrescriptionRecord(MedicalRecordBO medicalRecordBO);

    /**
     * IM推荐审核消息推送
     * IRemoter.sendImRecomRemind()
     *
     * @param recomRemindDTO
     *
     * @throws BusinessException
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    void sendImRecomRemind(IMRecomRemindDTO recomRemindDTO) throws BusinessException;

    /**
     * 根据医生id获取患者名信息
     * IRemoter.getPatientNames()
     *
     * @param doctorId
     * @param key      患者名关键字
     *
     * @return
     *
     * @throws BusinessException
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    Map<Long, PatientNameVO> getPatientNames(Long doctorId, String key) throws BusinessException;

    /*
     * ============================B2C服务相关=================================
     */

    /**
     * 获取商品列表
     * IRemoter.getMedicationList()
     *
     * @param doctorId
     * @param areaId
     * @param pIdList
     * @param isRecommend
     *
     * @return
     *
     * @throws BusinessException
     * @Date 2017年9月20日
     * @since 2.9.2
     */
    List<MedicationBoxVO> getMedicationList(Long doctorId, Integer areaId, List<Long> pIdList, boolean isRecommend)
            throws BusinessException;

    /**
     * 获取商品库存信息
     * IRemoter.getMedicationInventory()
     *
     * @param params
     * @param unionId
     *
     * @return
     *
     * @throws BusinessException
     * @Date 2017年9月20日
     * @since 2.9.2
     */
    Map<Long, InventoryInfoVo> getMedicationInventory(List<Map<String, Object>> params, String unionId) throws BusinessException;

    /**
     * 检查(患者)是否需要付费咨询
     * IRemoter.checkConsultNeedCharge()
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @throws BusinessException
     * @Author Ldl
     * @Date 2018年1月17日
     * @since 1.0.0
     */
    Integer checkConsultNeedCharge(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 发送少购提醒
     * IRemoter.sendRecomPartBuyNotify()
     *
     * @param notifyParamBO
     *
     * @throws BusinessException
     * @Date 2018年3月27日
     * @since 2.16
     */
    void sendRecomPartBuyNotify(RecomBuyNotifyParamBO notifyParamBO);

    /**
     * 根据医生id获取提醒备案推药权限
     * IRemoter.getRecordInfoByDoctorId()
     *
     * @param doctorId
     *
     * @return
     *
     * @throws BusinessException
     * @Date 2018年3月29日
     * @since 2.16
     */
    DrRecordAuthorityBO getRecordInfoByDoctorId(Long doctorId) throws BusinessException;

    /**
     * 获取药品默认用法用量
     * IRemoter.getDefaultUsage()
     *
     * @param skuIds
     *
     * @return
     *
     * @throws BusinessException
     * @Date 2018年6月28日
     * @since 2.19
     */
    List<MedicationDefaultUsageBO> getDefaultUsage(String skuIds) throws BusinessException;

    /**
     * 检查指定时间段内是否有诊疗记录
     * IRemoter.checkRevisitNotice()
     *
     * @param doctorId
     * @param patientId
     * @param startDate
     * @param endDate
     *
     * @return
     *
     * @throws BusinessException
     * @Date 2018年6月28日
     * @since 2.19
     */
    boolean checkRevisitNotice(Long doctorId, Long patientId, Date startDate, Date endDate) throws BusinessException;

    /**
     * 保存病历
     * IRemoter.saveDrCase()
     *
     * @param params
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年6月28日
     * @since 1.0.0
     */
    DrRecordIdBO saveDrCase(DrCaseParams params) throws BusinessException;

    /**
     * 查询病历对象(发消息用)
     * IRemoter.getDrCaseByRecomId()
     *
     * @param recommendId
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月28日
     * @since 1.0.0
     */
    MedicalRecordDoctorBO getDrCaseByRecomId(Long recommendId) throws BusinessException;

    /**
     * 更新病历状态
     * IRemoter.updateRecord()
     *
     * @param recordId
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月29日
     * @since 1.0.0
     */
    void updateRecord(String recordId) throws BusinessException;

    /**
     * 调用b2c获取药品列表
     *
     * @param medicationParamBO
     *
     * @return
     *
     * @throws BusinessException
     */
    List<MedicationDetailBO> getMedicationDetailList(MedicationParamBO medicationParamBO) throws BusinessException;

    /**
     * 获取医生咨询收费状态
     *
     * @return (0 : 免费 ， 1 : 收费)
     */
    Integer getDrConsultChargeStatus(Long doctorId, Long patientId) throws BusinessException;

}
